/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
 var combinationSum = function(candidates, target) {
    // 参数 要传入这个总和 和下一个的其实位置
    // 退出 当前sum 大于等于 target
    // 单层逻辑 遍历数组,从其实位置,判断总和 递归判断 进行回溯
    let pathList = []
    let path = []
    const backTracking = function(sum,startIndex){
        if(sum > target){
            return 
        }
        if(sum === target){
            pathList.push([...path])
            return
        }
        for(let i = startIndex;i < candidates.length && sum <= target;i++){
            sum += candidates[i]
            path.push(candidates[i])
            backTracking(sum,i)
            sum -= candidates[i]
            path.pop()
        }
    }
    candidates = candidates.sort()
    backTracking(0,0)
    return pathList
};
// combinationSum([100,200,4,12],400)